const joi = require('joi');

exports.joiConfig = (req, res, next) => {
	// 设置全局中文提示
	req.joi = joi.defaults((schema) =>
		schema.messages({
			// 数值类型
			'number.base': '{{#label}} 必须是一个数字',
			'number.greater': '{{#label}} 必须大于 {{#limit}}',
			'number.infinity': '{{#label}} 不能是infinity',
			'number.integer': '{{#label}} 必须是整数',
			'number.less': '{{#label}} 必须小于 {{#limit}}',
			'number.max': '{{#label}} 必须小于或等于 {{#limit}}',
			'number.min': '{{#label}} 必须大于或等于 {{#limit}}',
			'number.multiple': '{{#label}} 必须是 {{#multiple}} 的倍数',
			'number.negative': '{{#label}} 必须是负数',
			'number.port': '{{#label}} 必须是有效的端口',
			'number.positive': '{{#label}} 必须是正数',
			'number.precision': '{{#label}} 的小数位数不得超过',
			'number.unsafe': '{{#label}} 必须是安全数字',

			'string.alphanum': '{{#label}} 字符串必须只包含字母和数字',
			'string.base': '{{#label}} 必须是字符串',
			'string.base64': '{{#label}} 必须是有效的base64字符串',
			'string.creditCard': '{{#label}} 必须是信用卡',
			'string.dataUri': '{{#label}} 必须是有效的data uri字符串',
			'string.domain': '{{#label}} 必须包含有效的域名',
			'string.email': '{{#label}} 必须是有效的电子邮件',
			'string.empty': '{{#label}} 不允许为空',
			'string.guid': '{{#label}} 必须是有效的guid',
			'string.hex': '{{#label}} 只能包含十六进制字符',
			'string.hexAlign': '{{#label}} 十六进制解码表示必须是字节对齐的',
			'string.hostname': '{{#label}} 必须是有效的主机名',
			'string.ip': '{{#label}} 必须是带有 {{#cidr}} CIDR的有效ip地址',
			'string.ipVersion': '{{#label}} 必须是以下版本之一的有效ip地址 {{#version}} 带有 {{#cidr}} CIDR',
			'string.isoDate': '{{#label}} 必须采用iso格式',
			'string.isoDuration': '{{#label}} 必须是有效的ISO 8601持续时间',
			'string.length': '{{#label}} 长度必须为 {{#limit}} 个字符',
			'string.lowercase': '{{#label}} 只能包含小写字符',
			'string.max': '{{#label}} 长度必须小于或等于 {{#limit}} 个字符',
			'string.min': '{{#label}} 长度必须至少为 {{#limit}} 个字符',
			'string.normalize': '{{#label}} 必须是以 {{#form}} 格式规范化的unicode',
			'string.token': '{{#label}} 只能包含字母数字和下划线字符',
			'string.pattern.base': '{{#label}} 值为 {:[.]} 无法匹配所需的模式: {{#regex}}',
			'string.pattern.name': '{{#label}} 值为 {:[.]} 无法匹配 {{#name}} 模式',
			'string.pattern.invert.base': '{{#label}} with value {:[.]} matches the inverted pattern: {{#regex}}',
			'string.pattern.invert.name': '{{#label}} with value {:[.]} matches the inverted {{#name}} pattern',
			'string.trim': '{{#label}} 不得有前导或尾随空格',
			'string.uri': '{{#label}} 必须是有效的uri',
			'string.uriCustomScheme': '{{#label}} 必须是有效的uri，其方案与 {{#scheme}} 模式匹配',
			'string.uriRelativeOnly': '{{#label}} 必须是有效的相对uri',
			'string.uppercase': '{{#label}} 必须只包含大写字符',

			'boolean.base': '{{#label}} 必须是一个布尔值',

			'array.base': '{{#label}} 必须是数组',
			'array.excludes': '{{#label}} 包含一个排除值',
			'array.hasKnown': '{{#label}} 不包含类型 {:#patternLabel} 所需的至少一个匹配项',
			'array.hasUnknown': '{{#label}} 不包含至少一个必需的匹配项',
			'array.includes': '{{#label}} 与任何允许的类型都不匹配',
			'array.includesRequiredBoth': '{{#label}} 不包含 {{#knownMisses}} 和 {{#unknownMisses}} 其他必需值',
			'array.includesRequiredKnowns': '{{#label}} 不包含 {{#knownMisses}}',
			'array.includesRequiredUnknowns': '{{#label}} 不包含 {{#unknownMisses}} 个必需值',
			'array.length': '{{#label}} 必须包含 {{#limit}} 个项目',
			'array.max': '{{#label}} 必须包含少于或等于 {{#limit}} 个项目',
			'array.min': '{{#label}} 必须包含至少 {{#limit}} 个项目',
			'array.orderedLength': '{{#label}} 必须最多包含 {{#limit}} 个项目',
			'array.sort': '{{#label}} must be sorted in {#order} order by {{#by}}',
			'array.sort.mismatching': '{{#label}} 由于类型不匹配而无法排序',
			'array.sort.unsupported': '{{#label}} cannot be sorted due to unsupported type {#type}',
			'array.sparse': '{{#label}} 不能是稀疏数组项',
			'array.unique': '{{#label}} 包含重复值',

			'function.arity': '{{#label}} 必须是 {{#n}} 个参数',
			'function.class': '{{#label}} 必须是一个类',
			'function.maxArity': '{{#label}} 的参数数量必须小于或等于 {{#n}}',
			'function.minArity': '{{#label}} 的参数数量必须大于或等于 {{#n}}',

			// 对象类型
			'object.and': '{{#label}} 包含 {{#presentWithLabels}} 但没有其必需的对等体 {{#missingWithLabels}}', // 如果有一个属性，必须要有另外要给属性
			'object.assert': '{{#label}} 无效，因为 {if(#subject.key, `"` + #subject.key + `" 未能 ` + (#message || "pass the assertion test"), #message || "the assertion failed")}',
			'object.base': '{{#label}} 的类型必须为 {{#type}}',
			'object.instance': '{{#label}} 必须是 {{:#type}} 的实例',
			'object.length': '{{#label}} 必须具有 {{#limit}} 键{if(#limit == 1, "", "s")}',
			'object.max': '{{#label}} must have less than or equal to {{#limit}} key{if(#limit == 1, "", "s")}',
			'object.min': '{{#label}} must have at least {{#limit}} key{if(#limit == 1, "", "s")}',
			'object.missing': '{{#label}} must contain at least one of {{#peersWithLabels}}',
			'object.nand': '{{:#mainWithLabel}} must not exist simultaneously with {{#peersWithLabels}}',
			'object.oxor': '{{#label}} contains a conflict between optional exclusive peers {{#peersWithLabels}}',
			'object.pattern.match': '{{#label}} keys failed to match pattern requirements',
			'object.refType': '{{#label}} 必须是 Joi 引用',
			'object.regex': '{{#label}} 必须是RegExp对象',
			'object.rename.multiple': '{{#label}} cannot rename {{:#from}} because multiple renames are disabled and another key was already renamed to {{:#to}}',
			'object.rename.override': '{{#label}} cannot rename {{:#from}} because override is disabled and target {{:#to}} exists',
			'object.schema': '{{#label}} must be a Joi schema of {{#type}} type',
			'object.unknown': '不允许使用 {{#label}}',
			'object.with': '{{:#mainWithLabel}} missing required peer {{:#peerWithLabel}}',
			'object.without': '{{:#mainWithLabel}} conflict with forbidden peer {{:#peerWithLabel}}',
			'object.xor': '{{#label}} contains a conflict between exclusive peers {{#peersWithLabels}}',

			'date.base': '{{#label}} 必须是有效日期',
			'date.format': '{{#label}} 必须采用 {msg("date.format." + #format) || #format} format',
			'date.greater': '{{#label}} 必须大于 {{:#limit}}',
			'date.less': '{{#label}} 必须小于 {{:#limit}}',
			'date.max': '{{#label}} 必须小于或等于 {{:#limit}}',
			'date.min': '{{#label}} 必须大于或等于 {{:#limit}}',
			// Messages used in date.format
			'date.format.iso': 'ISO 8601 date',
			'date.format.javascript': '时间戳或毫秒数',
			'date.format.unix': '时间戳或秒数',

			'symbol.base': '{{#label}} 必须是 symbol',
			'symbol.map': '{{#label}} 必须是 {{#map}} 之一',

			'alternatives.all': '{{#label}} 与所有必需的类型都不匹配',
			'alternatives.any': '{{#label}} 与任何允许的类型都不匹配',
			'alternatives.match': '{{#label}} 与任何允许的类型都不匹配',
			'alternatives.one': '{{#label}} 匹配多个允许的类型',
			'alternatives.types': '{{#label}} 必须是 {{#types}} 之一',

			'any.custom': '{{#label}} 自定义验证失败，因为 {{#error.message}}',
			'any.default': '{{#label}} 在运行默认方法时出错',
			'any.failover': '{{#label}} 在运行故障转移方法时出错',
			'any.invalid': '{{#label}} 包含无效值',
			'any.only': '{{#label}} 必须为 {if(#valids.length == 1, "", "其中之一 ")}{{#valids}}',
			'any.ref': '{{#label}} {{#arg}} 引用 {{:#ref}} 其中 {{#reason}}',
			'any.required': '{{#label}} 是必需的',
			'any.unknown': '{{#label}} 不允许使用',

			'binary.base': '{{#label}} 必须是 buffer 或字符串',
			'binary.length': '{{#label}} 必须是 {{#limit}} 字节',
			'binary.max': '{{#label}} 必须小于或等于 {{#limit}} 字符',
			'binary.min': '{{#label}} 必须至少为 {{#limit}} 字符'
		})
	);
	next();
};
